/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dao;

import bentity.bePerfil;
import bentity.bePrivilegio;
import blogic.blPerfilxPrivilegio;
import blogic.blPrivilegio;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author luis
 */
public class daoPerfil {
    protected Connection conexion;

    public int registrarPerfil(bePerfil perfil, ArrayList<bePrivilegio> listaPrivilegios) throws SQLException{
        conexion = daoHelper.dameConexion();

        //Se inserta el Perfil
        String sql = "INSERT INTO PERFIL(descripcion, estadoperfil) VALUES (?, ?)";
        PreparedStatement ps = conexion.prepareStatement(sql);        
        ps.setString(1, perfil.getDescripcion());
        ps.setInt(2, perfil.C_ACTIVO);
        ps.executeUpdate();

        //Obtener el ID del perfil que se acaba de registrar
        bePerfil perfilRegistrado = new bePerfil();
        perfilRegistrado =this.obtenerPerfil(perfil.getDescripcion());

        bePrivilegio privilegio = new bePrivilegio();
        blPrivilegio gestorPrivilegios = new blPrivilegio();
        blPerfilxPrivilegio gestorPerfilxPrivilegios = new blPerfilxPrivilegio();

        //Se insertan los privilegios del Perfil
        for (int i = 0; i < listaPrivilegios.size(); i++) {
            privilegio = gestorPrivilegios.queryByNombre(listaPrivilegios.get(i).getDescripcion());
            gestorPerfilxPrivilegios.registrar(perfilRegistrado.getId(), privilegio.getId());
        }
        ps.close();
        conexion.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public int actualizarPerfil(bePerfil perfil, ArrayList<bePrivilegio> listaPrivilegios) throws SQLException{
        conexion = daoHelper.dameConexion();

        //Se actualiza el Perfil
        String sql = "UPDATE PERFIL SET descripcion=?, estadoPerfil=? WHERE id_Perfil=?";
        PreparedStatement ps = conexion.prepareStatement(sql);
        ps.setString(1, perfil.getDescripcion());
        ps.setInt(2, perfil.getEstado());
        ps.setInt(3, perfil.getId());
        ps.executeUpdate();

        if (listaPrivilegios!=null){
            //Se eliminan todos los privilegios del perfil
            (new daoPerfilxPrivilegio()).eliminarPerfilxPrivilegio(perfil.getId());

            //Se insertan todos los nuevos privilegios
            for (int i = 0; i < listaPrivilegios.size(); i++) 
                (new daoPerfilxPrivilegio()).insertarPerfilxPrivilegio(perfil.getId(), listaPrivilegios.get(i).getId());            
        }
        ps.close();
        conexion.close();
        return daoHelper.TRANSACCION_EXITOSA;
    }

    public bePerfil obtenerPerfil(String nombre) {
        conexion = daoHelper.dameConexion();
        String sql = "SELECT * FROM PERFIL WHERE ESTADOPERFIL=? AND DESCRIPCION=? ";
        bePerfil perfil = new bePerfil();
        
        try {
            PreparedStatement ps = conexion.prepareStatement(sql);
            ps.setInt(1, perfil.C_ACTIVO);
            ps.setString(2, nombre);

            ResultSet rs = ps.executeQuery();
            while (rs.next()){
                perfil = new bePerfil(rs.getInt(1),rs.getString(2));
            }
            rs.close();
            ps.close();
            conexion.close();
        }
        catch (Exception e) {
            System.out.print(e.getMessage());
            return null;
        }
        
        return perfil;
    }

    public bePerfil queryById(int idPerfil) {
        conexion = daoHelper.dameConexion();
        String sql = "SELECT * FROM PERFIL WHERE ESTADOPERFIL = ? AND id_Perfil=? ";
        bePerfil perfil = new bePerfil();

        try {
            PreparedStatement ps = conexion.prepareStatement(sql);
            ps.setInt(1, perfil.C_ACTIVO);
            ps.setInt(2, idPerfil);

            ResultSet rs = ps.executeQuery();
            while (rs.next()){
                perfil = new bePerfil(rs.getInt(1),rs.getString(2), rs.getInt(3));
            }
            rs.close();
            ps.close();
            conexion.close();
        }
        catch (Exception e) {
            System.out.print(e.getMessage());
            return null;
        }
        
        return perfil;
    }

    public ArrayList<bePerfil> queryAll() {
        conexion = daoHelper.dameConexion();
        String sql = "SELECT * FROM PERFIL WHERE ESTADOPERFIL = ?";

        ArrayList<bePerfil> listaPerfiles = new ArrayList<bePerfil>();
        bePerfil perfil = new bePerfil();
        
        try{
            PreparedStatement ps = conexion.prepareStatement(sql);
            ps.setInt(1, perfil.C_ACTIVO);
            ResultSet rs = ps.executeQuery();
            while (rs.next()){
                perfil = new bePerfil(rs.getInt(1),rs.getString(2));
                listaPerfiles.add(perfil);
            }
            rs.close();
            ps.close();
            conexion.close();
        }
        catch (Exception e) {
            System.out.print(e.getMessage());
        }

        return listaPerfiles;
    }

    public int eliminarPerfil(bePerfil perfil) throws SQLException{
        perfil.setEstado(perfil.C_ELIMINADO); //0 -> Inactivo
        return actualizarPerfil(perfil, null);
    }    
}
